﻿#include "../myclient/tcpsocket.h" //这里包含的时候，要使用正确的路径
#include <iostream>
using namespace std;

int main()
{
    //1.初始化socket环境
    init_socket();

    //获取终端的名称
    char servername[128] = { 0 };
    gethostname(servername, 128);

    //2.创建SOCKET对象，做配置，绑定，启动监听，等待客户端的连接
    SOCKET serversocket = serverSocket();
    cout << "这是服务端：" << servername << ",等待客户端的连接..." << endl;

    //3.使用accept函数接收来自客户端的连接请求，它有三个参数：
    //第一个参数，是处于监听状态的那个服务端SOCKET对象，即serversocket
    //第二个参数和第三个参数，分别是两个指针，指向了对方即客户端的结构体信息，都写NULL，等建立连接后，自动会设置
    //返回值：成功建立了连接的客户端的SOCKET对象，如果失败会返回INVALID_SOCKET
    SOCKET accept_soc = accept(serversocket, NULL, NULL);
    if (accept_soc == INVALID_SOCKET)
    {
        cout << "服务端SOCKET对象创建失败，错误码：" << WSAGetLastError() << endl;
    }

    //4.此时就可以进行数据的传输了，使用send发送，使用recv接收
    //准备一个字符数组，来存储所有收发的消息
    char buf[512] = { 0 };
    //写一个死循环，让聊天可以持续下去
    while (true)
    {
        //每次使用buf之前，都需要将它清空，不要保留历史消息
        memset(buf, 0, 512);

        //接下来使用recv来接受消息，它有四个参数：
        //第一个参数，是已经建立了连接到那个SOCKET对象，accept_soc
        //第二个参数，是接收到的消息的存储位置，即buf
        //第三个参数，是存储位置的大小，即512个字节
        //第四个参数，是一条调节recv使用行为的参数，我们不使用特殊行为，所以这个参数设置为0
        //返回值：接收到的消息的字节数，如果失败返回SOCKET_ERROR常量
        if (recv(accept_soc, buf, 512, 0) > 0)
        {
            cout << "客户端说：" << buf << endl;
        }
        else
        {
            cout << "服务端recv失败，错误码：" << WSAGetLastError() << endl;
            break;
        }

        //5.使用send回消息
        //send的用法跟recv一样
        memset(buf, 0, 512);//先清空
        cout << "服务端说：";
        cin.getline(buf, 512);
        if (send(accept_soc, buf, 512, 0) == SOCKET_ERROR)
        {
            cout << "服务端send失败，错误码：" << WSAGetLastError() << endl;
            break;
        }
    }

    //退出循环后，聊天结束，需要做清理工作
    //第一步，先清理掉所有的SOCKET对象，使用的是closesocket函数
    closesocket(serversocket);
    closesocket(accept_soc);
    //第二步，释放socket系统资源
    close_socket();

    return 0;
}

